/**
 * 购物车模块vuex
 */
export default {
  namespaced: true,
  state: () => ({
    /**
     * 购物车中的商品
     * item结构
     *  - goods_id          商品id
     *  - goods_name        商品名
     *  - goods_price       商品价格
     *  - goods_count       购物车中该商品数量
     *  - goods_small_logo  商品图标
     *  - goods_state       商品是否参与结算
     */
    cartList: JSON.parse(uni.getStorageSync('cartList') || '[]')
  }),
  mutations: {
    /**
     * 将商品添加到购物车
     * @param {Object} good 要添加的商品
     */
    addCartList(state, good) {
      // 查找商品是否已经加入购物车了
      const resultGood = state.cartList.find(item => item.goods_id === good.goods_id)

      // 如果未在购物车中，加入购物车
      if (!resultGood)
        state.cartList.push(good)
      // 在购物车中，则商品数量叠加
      else
        resultGood.goods_count += good.goods_count
      this.commit('m_cart/save')
    },
    /**
     * 根据传入对象更新cartList中某项的值，对象中的goods_id必传
     * @param {Object} good 更新的商品对象
     */
    updateCartListItem(state, good) {
      let oldGoodIndex = state.cartList.findIndex(item => item.goods_id === good.goods_id)
      if (oldGoodIndex === -1)
        return
      // 旧值用新值替换
      let oldGood = state.cartList[oldGoodIndex]
      for(let key in good)
         oldGood[key] = good[key] 
      state.cartList.splice(oldGoodIndex, 1, oldGood)
      this.commit('m_cart/save')
    },
    /**
     * 根据传入good对象或goods_id删除cartList中某项的值，对象中的goods_id必传
     * @param {Object|String} 要删除的good对象，也可直接传入goods_id
     */
    deleteCartListItem(state, good) {
      let goods_id = good.goods_id || good
      let delGoodIndex = state.cartList.findIndex(item => item.goods_id === goods_id)
      if (delGoodIndex === -1)
        return
      state.cartList.splice(delGoodIndex, 1)
      this.commit('m_cart/save')
    },
    /**
     * 切换全选按钮状态
     */
    selectAllChange(state) {
      // 获取全选按钮新状态（旧状态取反）
      let flag = !this.getters['m_cart/selectAll']
      state.cartList.forEach(item => item.goods_state = flag)
      this.commit('m_cart/save')
    },
    /**
     * 将购物车数据持久化保存到本地
     */
    save(state) {
      // 持久化保存到本地
      uni.setStorageSync('cartList', JSON.stringify(state.cartList))
    }
  },
  getters: {
    /**
     * 购物车中选中商品总数
     */
    cartListSelectedTotal(state) {
      let total = 0
      state.cartList.forEach(item => {
        total += item.goods_state ? item.goods_count : 0
      })
      return total
    },
    /**
     * 购物车中的商品总数
     */
    cartListTotal(state) {
      let total = 0
      state.cartList.forEach(item => {
        total += item.goods_count
      })
      return total
    },
    /**
     * 购物车中选中的商品总价
     */
    cartListSelectedPrice(state) {
      let total = 0
      state.cartList.forEach(item => {
        total += item.goods_state ? item.goods_count * item.goods_price : 0
      })
      return total.toFixed(2)
    },
    /**
     * 全选按钮显示状态
     */
    selectAll(state) {
      for(let item of state.cartList)
        if (!item.goods_state)
          return false
      return true
    }
  }
}
